package edu.cuit.avatar;

import java.util.Scanner;

/**
 * 判断回文字符串时忽略既非字母又非数字的字符
 * @author <a href="mailto:1020zhaodan@163.com">Adan</a>
 * @version 1.0
 * @date 2025/7/9 14:03
 */
public class Palindrome {
    public static void main(String[] args) {
        System.out.println("请输入字符串:");
        Scanner input = new Scanner(System.in);
        String str = input.nextLine();

        /*
         * 1.过滤掉源字符串中的特殊字符,形成新的字符串
         * 2.判断新的字符串是不是回文串
         *      2.1 反转目标字符串
         *      2.2 反转后的字符串后未反转之前的字符串内容是否相等(相等即为回文串)
         */
        System.out.printf("%s 是否为回文串:%b", str, isPalindrome(str));

    }

    /**
     * 过滤掉源字符串中的特殊字符,形成新的字符串
     * @param s 源字符串
     * @return 去掉既非字母也非数字字符后的新字符串
     */
    public static String filter(String s){
        var sb = new StringBuilder();
        var letters = s.toCharArray();
        for(var e : letters){
            if(Character.isLetterOrDigit(e))
                sb.append(e);
        }
        return sb.toString();
    }

    /**
     * 将源字符串进行反转
     * @param s 源字符串
     * @return 反转后的新的字符串
     */
    public static String reverse(String s){
        var sb = new StringBuilder(s);
        return sb.reverse().toString();
    }

    public static boolean isPalindrome(String s){
        String token = filter(s);
        String dest = reverse(token);
        return token.equals(dest);
    }
}
